详解负数取模运算

有人如果在python上使用%运算,肯定会遇到这样的问题,就是它在负数上的结果和我们之前在C或JAVA上的结果不一样。比如: -6 % 5这个运算,在python中的结果是4,但是在C/JAVA上的结果是-1

这是为什么呢?wiki百科的解释很好,英文好的可以去看看,这里做一个简单的搬运:

取模运算

所谓取模运算在数学上就是通过辗转相除法得到的余数,一般满足下面这个式子:

{\displaystyle {\begin{aligned}q\,&\in \mathbb {Z} \\a\,&=nq+r\\|r|\,&<|n|\end{aligned}}}

所以,r = a - nq,而q的计算历史上出了2个分支:

truncate

这派的思想很简单,就是截去小数部分。

r=a-n\operatorname {trunc} \left({\frac {a}{n}}\right)

比如3/2 = 1 , -3/2 = -1

简单,粗暴。

floor

floor是Donald Knuth大神提出来的,它的意思是像下取整。这个就有意思了,因为在正数的时候和truncate一样,但是在负数的时候,向下取整就会出现和truncate不一样的结果。

r=a-n\left\lfloor {\frac {a}{n}}\right\rfloor

比如:3/2 = 1 -3/2 = -2

其他

当然还有其他的一些人提出的一些别的方案,但是都大同小异,有些要确保r为正,有些在正数和负数的时候做不同的操作……

运用

C

C还有JAVA使用的truncate的方法,所以在计算-6 % 5 的时候是这么算的:

-6 - (5*trunc(-6/5))= -6 - (5 * -1) = -1

python

python使用的floor除法的方式

-6 - (5*floor(-6/5))= -6 - (5 * -2) = 4

结论

反正,在取模运算上,基本不同的语言都有自己的一套机制,一般来说,这套机制在正数上都一样,所以为了避免出现不必要的问题,建议先把负数转成正数再做取模运算。

  • 11
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
矩阵运算是一种广泛应用于数值计算和科学计算的运算方式,能够高效、准确地处理大量数据。Matlab作为一种专业的数学软件,提供了丰富的矩阵运算功能,下面将对常见的矩阵运算进行详细解释。 1. 矩阵乘法 矩阵乘法是矩阵运算中最基础的运算,它的实现方法是将一个矩阵的每一行与另一个矩阵的每一列进行内积运算,并将结果相加。在Matlab中,可以使用“*”运算符来进行矩阵乘法。 例如,对于两个矩阵A和B,它们的矩阵乘积C可以表示为: C = A * B 需要注意的是,矩阵乘法要求左边矩阵的列数与右边矩阵的行数相等,否则无法进行乘法运算。 2. 矩阵加法和减法 矩阵加法和减法是通过对应元素的加减来实现的。在Matlab中,可以使用“+”和“-”运算符来进行矩阵加法和减法。 例如,对于两个矩阵A和B,它们的矩阵加法和减法分别表示为: C = A + B D = A - B 需要注意的是,两个矩阵进行加减法的前提条件是它们的维度相同。 3. 矩阵转置 矩阵转置是将矩阵的行列互换的操作,可以使用“'”运算符来进行矩阵转置。 例如,对于一个矩阵A,它的转置矩阵表示为: B = A' 需要注意的是,矩阵转置不改变矩阵的元素值,只是改变了它们的排列顺序。 4. 矩阵求逆 矩阵求逆是指对于一个可逆矩阵,求出其逆矩阵的过程。在Matlab中,可以使用“inv”函数来求矩阵的逆。 例如,对于一个可逆矩阵A,它的逆矩阵表示为: B = inv(A) 需要注意的是,非可逆矩阵没有逆矩阵。 5. 矩阵求行列式 矩阵行列式是一个数值,它可以用来判断矩阵是否可逆。在Matlab中,可以使用“det”函数来求矩阵的行列式。 例如,对于一个矩阵A,它的行列式表示为: d = det(A) 需要注意的是,行列式为0的矩阵是不可逆的。 6. 矩阵求特征值和特征向量 矩阵的特征值和特征向量是矩阵在线性变换下的重要性质,在许多数学问题中都有广泛的应用。在Matlab中,可以使用“eig”函数来求矩阵的特征值和特征向量。 例如,对于一个矩阵A,它的特征值和特征向量分别表示为: [V,D] = eig(A) 其中,V为特征向量矩阵,D为特征值矩阵。 以上是Matlab中常见的矩阵运算,它们在数值计算、科学计算、数据分析等领域中都有广泛的应用。需要注意的是,在进行矩阵运算时,要特别关注矩阵的维度和性质,以确保运算的正确性和有效性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值